package com.imooc.controller;

import com.imooc.dataobject.ProductCategory;
import com.imooc.dataobject.ProductInfo;
import com.imooc.service.CategoryService;
import com.imooc.service.ProductService;
import com.imooc.utils.ResultVoUtils;
import com.imooc.vo.ProductInfoVo;
import com.imooc.vo.ProductVo;
import com.imooc.vo.ResultVo;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 功能描述: <br>
 * (买家商品相关)
 *
 * @Author:Mr. xyb
 * @Date: 2018/5/18 17:32
 * @since: 1.8.0
 * @version: 1.0.0
 */
@RestController
@RequestMapping("/buyer/product")
public class BuyerProductController {

    @Autowired
    private ProductService productService;

    @Autowired
    private CategoryService categoryService;


    /**
     * (商品列表controller)
     * 此为前台展示，因此为显示所有已经上架的商品
     *
     * @return
     */
    @GetMapping("list")
    @Cacheable(cacheNames = "product", key = "123")// 查询之后将对象保存到缓存层中
    public ResultVo list() {

        /*1、 查询所有上架的商品*/
        List<ProductInfo> productInfos = productService.findUpAll();

        /*2、 查询类目（一次性查询）*/
        // 传统写法
        /*List<Integer> categoryTypeList = new ArrayList<>();
        for (ProductInfo info : productInfos) {
            categoryTypeList.add(info.getCategoryType());
        }*/

        // 精简写法(java8 lambda) 将每个商品的类目属性保存为一个list集合
        List<Integer> categoryTypeList = productInfos.stream().map(e -> e.getCategoryType()).collect(Collectors.toList());
        // 通过上面的类目list查询出所有类目对象保存为list集合
        List<ProductCategory> productCategoryList = categoryService.findByCategoryTypeIn(categoryTypeList);
        /*3、 数据拼装*/
        List<ProductVo> productVos = new ArrayList<>();
        for (ProductCategory category : productCategoryList) {// 遍历类目集合
            ProductVo productVo = new ProductVo();// 创建类目商品对象（包含商品类目数据以及此类目下的所有商品）
            // 设置类目的信息
            productVo.setCategoryName(category.getCategoryName());
            productVo.setCategoryType(category.getCategoryType());
            // 创建一个商品实体集合保存商品信息
            List<ProductInfoVo> productInfoVos = new ArrayList<>();
            for (ProductInfo info : productInfos) {// 遍历所有上架的商品
                if (info.getCategoryType().equals(category.getCategoryType())) { // 判断如果商品的类目编号当前类目编号相同
                    ProductInfoVo productInfoVo = new ProductInfoVo();// 创建一个商品实体
                    /*传统写法*/
                    /*productInfoVo.setProductId(info.getProductId());
                    productInfoVo.setProductName(info.getProductName());
                    productInfoVo.setProductDescription(info.getProductDescription());
                    productInfoVo.setProductIcon(info.getProductIcon());
                    productInfoVo.setProductPrice(info.getProductPrice());*/
                    /*使用spring的工具方法复制对象的属性值*/
                    BeanUtils.copyProperties(info, productInfoVo);
                    productInfoVos.add(productInfoVo);// 将商品信息保存到list中
                }
            }
            // 遍历保存所有当前类目下的商品后，将商品集合设置到类目商品对象
            productVo.setProductInfoVoList(productInfoVos);
            productVos.add(productVo);// 最后设置对象
        }

        // 返回查询到的类目商品信息
        ResultVo resultVo = ResultVoUtils.success(productVos);
        return resultVo;
    }

}
